/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package py.una.pol.ii.is2.controller;

import com.sun.data.provider.RowKey;
import com.sun.rave.web.ui.appbase.AbstractPageBean;
import com.sun.webui.jsf.component.Button;
import com.sun.webui.jsf.component.Label;
import com.sun.webui.jsf.component.Listbox;
import com.sun.webui.jsf.component.StaticText;
import com.sun.webui.jsf.component.TableRowGroup;
import com.sun.webui.jsf.component.TextArea;
import com.sun.webui.jsf.component.TextField;
import com.sun.webui.jsf.event.TableSelectPhaseListener;
import com.sun.webui.jsf.model.Option;
import java.util.ArrayList;
import java.util.List;
import javax.ejb.EJB;
import javax.faces.FacesException;
import javax.faces.component.UIComponent;
import javax.faces.component.html.HtmlPanelGrid;
import javax.faces.context.FacesContext;
import javax.faces.event.ValueChangeEvent;
import py.una.pol.ii.is2.dao.sistema.PantallaDAO;
import py.una.pol.ii.is2.dao.taller.DetalleOrdenMantenimientoInsumoDAOLocal;
import py.una.pol.ii.is2.dao.taller.DetalleOrdenMantenimientoPlantillaDAOLocal;
import py.una.pol.ii.is2.domain.sistema.PantRol;
import py.una.pol.ii.is2.domain.sistema.Pantalla;
import py.una.pol.ii.is2.domain.taller.DetalleOrdenMantenimientoInsumo;
import py.una.pol.ii.is2.domain.taller.DetalleOrdenMantenimientoPlantilla;
import py.una.pol.ii.is2.extra.Messages;
import py.una.pol.ii.is2.facade.taller.OrdenMantenimientoFacadeLocal;

/**
 * <p>Page bean that corresponds to a similarly named JSP page.  This
 * class contains component definitions (and initialization code) for
 * all components that you have defined on this page, as well as
 * lifecycle methods and event handlers where you may add behavior
 * to respond to incoming events.</p>
 *
 * @version OrdenMantenimientoDetalle.java
 * @version Created on 15/05/2009, 11:30:39 AM
 * @author markos
 */
public class OrdenMantenimientoDetalle extends AbstractPageBean {
    // <editor-fold defaultstate="collapsed" desc="Managed Component Definition">

    /**
     * <p>Automatically managed component initialization.  <strong>WARNING:</strong>
     * This method is automatically generated, so any user-specified code inserted
     * here is subject to being replaced.</p>
     */
    private void _init() throws Exception {
    }
    private TextField txtCodigo = new TextField();

    public TextField getTxtCodigo() {
        return txtCodigo;
    }

    public void setTxtCodigo(TextField tf) {
        this.txtCodigo = tf;
    }
    private TextField txtNombre = new TextField();

    public TextField getTxtNombre() {
        return txtNombre;
    }

    public void setTxtNombre(TextField tf) {
        this.txtNombre = tf;
    }
    private Label lblEstado = new Label();

    public Label getLblEstado() {
        return lblEstado;
    }

    public void setLblEstado(Label l) {
        this.lblEstado = l;
    }
    private TextArea txtDescripcion = new TextArea();

    public TextArea getTxtDescripcion() {
        return txtDescripcion;
    }

    public void setTxtDescripcion(TextArea ta) {
        this.txtDescripcion = ta;
    }
    private TextField txtPrecio = new TextField();

    public TextField getTxtPrecio() {
        return txtPrecio;
    }

    public void setTxtPrecio(TextField tf) {
        this.txtPrecio = tf;
    }
    private TextField txtDescripcionInsumo = new TextField();

    public TextField getTxtDescripcionInsumo() {
        return txtDescripcionInsumo;
    }

    public void setTxtDescripcionInsumo(TextField tf) {
        this.txtDescripcionInsumo = tf;
    }
    private Button botonOcultarDetalles = new Button();

    public Button getBotonOcultarDetalles() {
        return botonOcultarDetalles;
    }

    public void setBotonOcultarDetalles(Button b) {
        this.botonOcultarDetalles = b;
    }
    private Button botonAprobarMantenimiento = new Button();

    public Button getBotonAprobarMantenimiento() {
        return botonAprobarMantenimiento;
    }

    public void setBotonAprobarMantenimiento(Button b) {
        this.botonAprobarMantenimiento = b;
    }
    private Label labelForbidden = new Label();

    public Label getLabelForbidden() {
        return labelForbidden;
    }

    public void setLabelForbidden(Label l) {
        this.labelForbidden = l;
    }
    private HtmlPanelGrid gridPanelContent = new HtmlPanelGrid();

    public HtmlPanelGrid getGridPanelContent() {
        return gridPanelContent;
    }

    public void setGridPanelContent(HtmlPanelGrid hpg) {
        this.gridPanelContent = hpg;
    }
    private StaticText txtPrecioTotal = new StaticText();

    public StaticText getTxtPrecioTotal() {
        return txtPrecioTotal;
    }

    public void setTxtPrecioTotal(StaticText st) {
        this.txtPrecioTotal = st;
    }
    private StaticText txtPrecioPlantilla = new StaticText();

    public StaticText getTxtPrecioPlantilla() {
        return txtPrecioPlantilla;
    }

    public void setTxtPrecioPlantilla(StaticText st) {
        this.txtPrecioPlantilla = st;
    }
    private StaticText txtPrecioInsumos = new StaticText();

    public StaticText getTxtPrecioInsumos() {
        return txtPrecioInsumos;
    }

    public void setTxtPrecioInsumos(StaticText st) {
        this.txtPrecioInsumos = st;
    }
    private StaticText txtCostoManoObra = new StaticText();

    public StaticText getTxtCostoManoObra() {
        return txtCostoManoObra;
    }

    public void setTxtCostoManoObra(StaticText st) {
        this.txtCostoManoObra = st;
    }

    // </editor-fold>
    /**
     * <p>Construct a new Page bean instance.</p>
     */
    public OrdenMantenimientoDetalle() {
    }

    /**
     * <p>Callback method that is called whenever a page is navigated to,
     * either directly via a URL, or indirectly via page navigation.
     * Customize this method to acquire resources that will be needed
     * for event handlers and lifecycle methods, whether or not this
     * page is performing post back processing.</p>
     * 
     * <p>Note that, if the current request is a postback, the property
     * values of the components do <strong>not</strong> represent any
     * values submitted with this request.  Instead, they represent the
     * property values that were saved for this view when it was rendered.</p>
     */
    @Override
    public void init() {
        // Perform initializations inherited from our superclass
        super.init();
        // Perform application initialization that must complete
        // *before* managed components are initialized
        // TODO - add your own initialiation code here

        // <editor-fold defaultstate="collapsed" desc="Managed Component Initialization">
        // Initialize automatically managed components
        // *Note* - this logic should NOT be modified
        try {
            _init();
        } catch (Exception e) {
            log("OrdenMantenimientoDetalle Initialization Failure", e);
            throw e instanceof FacesException ? (FacesException) e : new FacesException(e);
        }

    // </editor-fold>
    // Perform application initialization that must complete
    // *after* managed components are initialized
    // TODO - add your own initialization code here
    }

    /**
     * <p>Callback method that is called after the component tree has been
     * restored, but before any event processing takes place.  This method
     * will <strong>only</strong> be called on a postback request that
     * is processing a form submit.  Customize this method to allocate
     * resources that will be required in your event handlers.</p>
     */
    @Override
    public void preprocess() {
    }

    /**
     * <p>Callback method that is called just before rendering takes place.
     * This method will <strong>only</strong> be called for the page that
     * will actually be rendered (and not, for example, on a page that
     * handled a postback and then navigated to a different page).  Customize
     * this method to allocate resources that will be required for rendering
     * this page.</p>
     */
    @Override
    public void prerender() {
        if (getNivelAcceso() >= 0) {
            labelForbidden.setRendered(false);
            if (verDetalleInsumo) {
                panelDetalleInsumo.setRendered(true);
                botonOcultarDetalles.setRendered(true);
            } else {
                panelDetalleInsumo.setRendered(false);
                botonOcultarDetalles.setRendered(false);
            }
        }else{
            labelForbidden.setRendered(true);
            gridPanelContent.setRendered(false);
        }
    }

    /**
     * <p>Callback method that is called after rendering is completed for
     * this request, if <code>init()</code> was called (regardless of whether
     * or not this was the page that was actually rendered).  Customize this
     * method to release resources acquired in the <code>init()</code>,
     * <code>preprocess()</code>, or <code>prerender()</code> methods (or
     * acquired during execution of an event handler).</p>
     */
    @Override
    public void destroy() {
    }

    /**
     * <p>Return a reference to the scoped data bean.</p>
     *
     * @return reference to the scoped data bean
     */
    protected ApplicationBean1 getApplicationBean1() {
        return (ApplicationBean1) getBean("ApplicationBean1");
    }

    /**
     * <p>Return a reference to the scoped data bean.</p>
     *
     * @return reference to the scoped data bean
     */
    protected RequestBean1 getRequestBean1() {
        return (RequestBean1) getBean("RequestBean1");
    }

    /**
     * <p>Return a reference to the scoped data bean.</p>
     *
     * @return reference to the scoped data bean
     */
    protected SessionBean1 getSessionBean1() {
        return (SessionBean1) getBean("SessionBean1");
    }
    private List<DetalleOrdenMantenimientoInsumo> listaDetalleInsumo;
    private List<DetalleOrdenMantenimientoPlantilla> listaDetallePlantilla;
    private List<Option> listaDetallePlantillaOption;
    @EJB
    private DetalleOrdenMantenimientoPlantillaDAOLocal detallePlantillaDao;
    @EJB
    private DetalleOrdenMantenimientoInsumoDAOLocal detalleInsumoDao;
    @EJB
    private OrdenMantenimientoFacadeLocal ordenMantenimientoFacade;
    private boolean verDetalleInsumo = false;
    private HtmlPanelGrid panelDetalleInsumo = new HtmlPanelGrid();
    private Listbox listboxPlantilla = new Listbox();
    private TableRowGroup tableRowGroupDetalleInsumo = new TableRowGroup();
    private Pantalla pantalla;
    @EJB
    private PantallaDAO pantallaDao;
    public static final String NOMBRE_PANTALLA = "OrdenMantenimientoDetalle.jsp";
    public static final String NOMBRE_PANTALLA_PRIMARIA = "OrdenesMantenimiento.jsp";
    private int nivelAcceso = PantRol.ACCESO_READ_ONLY;

    public int getNivelAcceso() {
        nivelAcceso = getSessionBean1().getNivelPermiso(NOMBRE_PANTALLA_PRIMARIA);
        return nivelAcceso;
    }

    public void setNivelAcceso(int nivelAcceso) {
        this.nivelAcceso = nivelAcceso;
    }

    public Pantalla getPantalla() {
        try {
            pantalla = pantallaDao.find(NOMBRE_PANTALLA);
        } catch (Exception e) {
            pantalla = new Pantalla();
        }
        return pantalla;
    }

    public void setPantalla(Pantalla pantalla) {
        this.pantalla = pantalla;
    }

    public TableRowGroup getTableRowGroupDetalleInsumo() {
        return tableRowGroupDetalleInsumo;
    }

    public void setTableRowGroupDetalleInsumo(TableRowGroup tableRowGroupDetalleInsumo) {
        this.tableRowGroupDetalleInsumo = tableRowGroupDetalleInsumo;
    }

    public Listbox getListboxPlantilla() {
        return listboxPlantilla;
    }

    public void setListboxPlantilla(Listbox listboxPlantilla) {
        this.listboxPlantilla = listboxPlantilla;
    }

    public HtmlPanelGrid getPanelDetalleInsumo() {
        return panelDetalleInsumo;
    }

    public void setPanelDetalleInsumo(HtmlPanelGrid panelDetalleInsumo) {
        this.panelDetalleInsumo = panelDetalleInsumo;
    }

    private void cargarListaDetallePlantilla() {
        listaDetallePlantilla = new ArrayList<DetalleOrdenMantenimientoPlantilla>();
        try {
            listaDetallePlantilla = detallePlantillaDao.getListaDetalleOrdenMantenimientoPlantillasByCodOrden(getSessionBean1().getOrdenMantenimiento());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public List<Option> getListaDetallePlantillaOption() {
        listaDetallePlantillaOption = new ArrayList<Option>();
        try {
            cargarListaDetallePlantilla();
            for (int i = 0; i < listaDetallePlantilla.size(); i++) {
                DetalleOrdenMantenimientoPlantilla plantilla = listaDetallePlantilla.get(i);
                listaDetallePlantillaOption.add(new Option(plantilla.getDeopCod().toString(), plantilla.getDeopPlantilla().getPlmaNombre()));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        return listaDetallePlantillaOption;
    }

    public void setListaDetallePlantillaOption(List<Option> listaDetallePlantillaOption) {
        this.listaDetallePlantillaOption = listaDetallePlantillaOption;
    }

    public List<DetalleOrdenMantenimientoInsumo> getListaDetalleInsumo() {
        try {
            listaDetalleInsumo = detalleInsumoDao.getListaDetalleOrdenMantenimientoInsumosByCodDetallePlantilla(getSessionBean1().getDetalleMantenimiento());
        } catch (Exception e) {
            e.printStackTrace();
        }
        return listaDetalleInsumo;
    }

    public void setListaDetalleInsumo(List<DetalleOrdenMantenimientoInsumo> listaDetalleInsumo) {
        this.listaDetalleInsumo = listaDetalleInsumo;
    }

    public List<DetalleOrdenMantenimientoPlantilla> getListaDetallePlantilla() {
        cargarListaDetallePlantilla();
        return listaDetallePlantilla;
    }

    public void setListaDetallePlantilla(List<DetalleOrdenMantenimientoPlantilla> listaDetallePlantilla) {
        this.listaDetallePlantilla = listaDetallePlantilla;
    }

    public void listboxPlantilla_processValueChange(ValueChangeEvent event) {
        try {
            Integer codDetalle = Integer.parseInt(listboxPlantilla.getSelected().toString());
            DetalleOrdenMantenimientoPlantilla detallePlantilla = detallePlantillaDao.find(codDetalle);
            getSessionBean1().setDetalleMantenimiento(detallePlantilla);
            String estado = "Estado ";
            if (detallePlantilla.getDeopEstado().toString().equals("0")) {
                estado += "pendiente.";
                botonAprobarMantenimiento.setDisabled(false);
            } else {
                estado += "ejecutado.";

                botonAprobarMantenimiento.setDisabled(true);
            }
            lblEstado.setText(estado);
            txtPrecioPlantilla.setText(detallePlantilla.getDeopCostoInsumos().add(detallePlantilla.getDeopCostoManoObra()).toString());
            txtCostoManoObra.setText(detallePlantilla.getDeopCostoManoObra().toString());
            txtPrecioInsumos.setText(detallePlantilla.getDeopCostoInsumos().toString());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public String botonVerDetalleInsumo_action() {
        verDetalleInsumo = true;
        RowKey rowKey = tableRowGroupDetalleInsumo.getRowKey();
        getListaDetalleInsumo();
        DetalleOrdenMantenimientoInsumo detalle = listaDetalleInsumo.get(Integer.parseInt(rowKey.getRowId()));
        txtCodigo.setText(detalle.getDeoiCodInsumo().getInsuCod());
        txtNombre.setText(detalle.getDeoiCodInsumo().getInsuNombre());
        txtDescripcion.setText(detalle.getDeoiDescripcionUtilizacion());
        txtDescripcionInsumo.setText(detalle.getDeoiCodInsumo().getInsuDescripcion());
        txtPrecio.setText(detalle.getDeoiPrecio().toString());
        return null;
    }

    public String botonAprobarMantenimiento_action() {
        try {
            Integer codMantenimiento = Integer.parseInt(listboxPlantilla.getSelected().toString());
            if (ordenMantenimientoFacade.aprobarMantenimiento(codMantenimiento)) {
                botonAprobarMantenimiento.setDisabled(true);
                info(Messages.MANTENIMIENTO_CONFIRMADO);
            } else {
                botonAprobarMantenimiento.setDisabled(false);
                error(Messages.MANTENIMIENTO_FALLIDO);
            }
        } catch (Exception e) {
            e.printStackTrace();
            error(Messages.MANTENIMIENTO_FALLIDO + e);
        }
        return null;
    }

    public String botonVolver_action() {
        return "volver";
    }

    public String botonOcultarDetalles_action() {
        verDetalleInsumo = false;
        return null;
    }

    public void txtCodigo_validate(FacesContext context, UIComponent component, Object value) {
    }
    private TableSelectPhaseListener tablePhaseListener =
            new TableSelectPhaseListener();

    public TableSelectPhaseListener getTablePhaseListener() {
        return tablePhaseListener;
    }

    public void setTablePhaseListener(TableSelectPhaseListener tablePhaseListener) {
        this.tablePhaseListener = tablePhaseListener;
    }

    public void setSelected(Object object) {
        RowKey rowKey = (RowKey) getValue("#{currentRow.tableRow}");
        if (rowKey != null) {
            tablePhaseListener.setSelected(rowKey, object);
        }
    }

    public Object getSelected() {
        RowKey rowKey = (RowKey) getValue("#{currentRow.tableRow}");
        return tablePhaseListener.getSelected(rowKey);

    }

    public Object getSelectedValue() {
        RowKey rowKey = (RowKey) getValue("#{currentRow.tableRow}");
        return (rowKey != null) ? rowKey.getRowId() : null;
    }

    public boolean getSelectedState() {
        RowKey rowKey = (RowKey) getValue("#{currentRow.tableRow}");
        return tablePhaseListener.isSelected(rowKey);
    }

    public String botonModificarInsumo_action() {
        RowKey rowKey = tableRowGroupDetalleInsumo.getRowKey();
        getListaDetalleInsumo();
        DetalleOrdenMantenimientoInsumo detalle = listaDetalleInsumo.get(Integer.parseInt(rowKey.getRowId()));
        getSessionBean1().setDetalleOrdenMantenimientoInsumo(detalle);
        String retorno = "orden_detalle_insumo_update";
        return retorno;
    }

    public String botonEliminarInsumo_action() {
        String retorno = null;
        RowKey rowKey = tableRowGroupDetalleInsumo.getRowKey();
        getListaDetalleInsumo();
        DetalleOrdenMantenimientoInsumo detalle = listaDetalleInsumo.get(Integer.parseInt(rowKey.getRowId()));
        try {
            if (detalleInsumoDao.delete(detalle)) {
                info(Messages.ELIMINACION_EXITOSA);
            }
        } catch (Exception e) {
            error(Messages.ELIMINACION_FALLIDA + e);
            e.printStackTrace();
        } finally {
            return retorno;
        }
    }

    public String botonAgregarInsumo_action() {
        return "orden_detalle_insumo_add";
    }
}